package com.baixun.gassystem.treeUtils;




import com.baixun.gasentity.entity.SysVideoMessage;

import java.util.ArrayList;
import java.util.List;

/**
 * 自定义树行构建工具
 */

/**
 * TreeBuildUtils类用于提供构建树形结构数据的方法
 */
public class TreeBuildUtils {
    /**
     * 将平面数据列表构建为树形结构
     *
     * @param list 包含所有节点的平面数据列表，每个节点都有一个父节点ID属性
     * @return 返回构建好的树形结构数据列表，根节点为最顶级节点
     */
    public static List<SysVideoMessage> BuildTree(List<SysVideoMessage> list) {
        // 初始化返回列表，用于存储构建好的树形结构
        List<SysVideoMessage> returnList = new ArrayList<SysVideoMessage>();

        // 遍历所有节点，寻找并设置根节点及其子节点
        for (SysVideoMessage sysVideoMessage : list) {
            // 判断当前节点是否为最顶级节点（父节点ID为0）
            if (sysVideoMessage.getParentId() == 0){
                // 为当前顶级节点设置子节点
                setTwoChlidrens(list, sysVideoMessage);
                // 将当前顶级节点添加到返回列表中
                returnList.add(sysVideoMessage);
            }
        }

        // 返回构建好的树形结构数据列表
        return returnList;
    }




    /**
     * 递归设置视频消息的两级子节点
     * 该方法主要用于处理树形结构的数据，将当前节点的直接子节点和子节点的子节点（即两级子节点）设置完整
     *
     * @param list 视频消息列表，包含所有可能的子节点
     * @param sysVideoMessage 当前视频消息节点，用于查找其子节点
     */
    public static void setTwoChlidrens(List<SysVideoMessage> list, SysVideoMessage sysVideoMessage) {
        // 获取当前节点的直接子节点列表
        List<SysVideoMessage> sysVideoMessagesList = getChildrenList(list, sysVideoMessage);
        // 将获取到的直接子节点列表设置到当前节点
        sysVideoMessage.setSysVideoMessageList(sysVideoMessagesList);

        // 遍历当前节点的直接子节点列表
        for (SysVideoMessage sysVideoMessageOne : sysVideoMessagesList) {
            // 判断当前子节点是否还有自己的子节点
            if (hasClideren(list, sysVideoMessageOne)) {
                // 如果当前子节点还有子节点，则递归调用该方法，继续设置子节点的两级子节点
                setTwoChlidrens(list, sysVideoMessageOne);
            }
        }
    }

    /**
     * 获取全部二级子节点
     * 该方法主要用于获取给定列表中所有直接隶属于指定父节点的子节点
     * 它通过遍历列表，并根据每个节点的parentId与指定父节点的id进行匹配，来筛选出所有二级子节点
     *
     * @param list 包含所有节点的列表
     * @param topParent 指定的父节点，即一级节点
     * @return 返回一个包含所有直接隶属于指定父节点的二级子节点的列表
     */
    public static List<SysVideoMessage>  getChildrenList(List<SysVideoMessage> list, SysVideoMessage topParent) {
        // 初始化一个动态数组用于存储所有二级子节点
        ArrayList<SysVideoMessage> students = new ArrayList<>();
        // 遍历给定的节点列表
        for (SysVideoMessage sysVideoMessage : list) {
            // 判断当前节点的parentId是否与指定父节点的id相等，即判断当前节点是否为指定父节点的直接子节点
            if (sysVideoMessage.getParentId().intValue() == topParent.getId()){
                // 如果是直接子节点，则将其添加到二级子节点列表中
                students.add(sysVideoMessage);
            }
        }
        // 返回包含所有直接子节点的列表
        return students;
    }


    /**
     * 判断给定的视频消息对象是否具有子项
     * 该方法通过检查提供的视频消息列表中是否存在当前视频消息的子项来确定
     *
     * @param list 视频消息列表，包含所有可能的子项
     * @param sysVideoMessage 要检查的视频消息对象
     * @return 如果给定的视频消息对象有子项，则返回true；否则返回false
     */
    public  static boolean  hasClideren( List<SysVideoMessage> list, SysVideoMessage sysVideoMessage) {
        // 调用getChildrenList方法获取给定视频消息对象的子项列表，并检查列表大小是否大于0
        return getChildrenList(list, sysVideoMessage).size() > 0;
    }
}
